home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / gdb / gdb_18s.zoo / st-traps.s < prev    next >
Text File  |  1992-03-25  |  7KB  |  278 lines

  1. #
  2. # this file contains trap handlers etc for gdb.
  3. # see atarist.c for things that call this.
  4. #
  5. # Format of a context block:
  6. # registers d0-d7        8 * 4
  7. # registers a0-a6        7 * 4
  8. # USP    (.+60)            4
  9. # [SSP                4]
  10. # PC    (.+64)            4
  11. # SR    (.+68)            2
  12. #                ------
  13. # totalling            70 bytes
  14.  
  15.     .data
  16.     .comm    _child_context,70
  17.     .comm    _dbg_context,70
  18.     .comm    _old_ipl_2_vector,4
  19.     .globl    _child_context
  20.     .globl    _dbg_context
  21.  
  22. #
  23.  
  24.     .text            | this is the replacement handler
  25.     .globl    _ipl_2_vector    | for the IPL 2 interrupt.
  26. _ipl_2_vector:            | it's used to catch child programs
  27.                 | when we spawn them
  28.     movel    _old_ipl_2_vector,0x68    | restore the IPL 2 vector
  29.     movew    d0,sp@-        | get a temp
  30.     movew    sp@(2),d0    | get the saved SR
  31.     andiw    #0x0700,d0    | mask for current IPL
  32.     beq    L1        | 0? ok, that means we're spawning
  33.     oriw    #0x0300,sp@(2)    | set ipl in saved SR to 3
  34.     movew    sp@+,d0        | get reg back
  35.     rte
  36.  
  37. L1:
  38.                 | we've just started a child program,
  39.                 | and have ended up here, via HBLANK,
  40.                 | before executing the first instruction
  41.                 | of the child.
  42.                 | Save the child context into the child 
  43.                 | context block, restore the debugger
  44.                 | context from its context block, and
  45.                 | RTE into it.
  46.     movew    sp@+,d0        | get our d0 back
  47.     moveml    d0-a6,_child_context
  48.     lea    _child_context+15*4,a0
  49.     movel    usp,a1        | since this runs in super mode,
  50.     movel    a1,a0@+        |  we get the USP this way
  51.  
  52. #    movel    sp,a0@+        | that's the SSP
  53.  
  54.     movew    sp@+,d0        | save the old SR
  55.     movel    sp@+,a0@+    | get the child PC
  56.     andiw    #0xF8FF,d0    | zap the IPL
  57.     oriw    #0x0300,d0    | and set to IPL 3
  58.     movew    d0,a0@+        | and finally save the SR
  59.  
  60.     tstw    0x59e:w        |_longframe
  61.     beq    notlong1
  62.     addql    #2,sp        | "pop" the frame word
  63. notlong1:
  64.  
  65. #
  66. # now we have the child context safely stashed.  Go run the 
  67. # debugger context
  68. #
  69.  
  70.     jmp    run_debugger
  71.  
  72. #
  73. # this thing is for faking up a return context when we're
  74. # setting things up in the first place.  This is really sort of gross.
  75. # we funcall this routine from debugger initialization, when we're about 
  76. # ready to start the child program.  We want to return to the place 
  77. # that called this routine, so we can make like we returned after 
  78. # starting the child.  The way we do it is like this:  Before starting
  79. # the child, somebody will setjmp to make a jump block.  We then call 
  80. # setup_fake_debugger_context with the jump block.  It gets stashed here,
  81. # and we save the SP.  We then stash our registers etc in the debugger
  82. # context block (though that's probly not strictly necessary) with the 
  83. # PC of our fake_return kludge, below.  When we actually decide to switch
  84. # context back to the debugger, we RTE to the return_kludge, which will
  85. # fake a call to longjmp with the context block.  Yow.
  86. #
  87.  
  88.     .comm    fake_return_jmpbuf,4
  89.     .text
  90.     .globl    _setup_fake_debugger_context
  91. _setup_fake_debugger_context:
  92.     moveml    d0-a7,_dbg_context    | a7 is usp, as this runs in user mode
  93.     lea    _dbg_context+15*4,a0
  94.     subl    #32,a0@+        | open a hole so that when we rte,
  95.                     |  we'll have room
  96.     movel    #return_kludge,a0@+    | the place we will want to rte to
  97.     movew    #0x0300,d0        | SR: no T, no S, IPL 3
  98.     movew    d0,a0@+            | and our SR.
  99. #
  100. # now set up the funny return jmpbuf
  101. #
  102.  
  103.     movel    sp@(4),fake_return_jmpbuf
  104.     rts                | and return!
  105.  
  106. #
  107. # the thing we'll use when returning to debugger first time
  108. # after spawning child
  109. #
  110.  
  111.     .globl    _longjmp
  112. return_kludge:
  113.     pea    1:w            | push a 1, to say we jumped
  114.     movel    fake_return_jmpbuf,sp@-    | and the buf
  115.     jsr    _longjmp        | and do the jump.
  116.  
  117. #
  118. # exception handler entry points.  We assume that these all happen from
  119. # the child program.
  120. #
  121.  
  122.     .comm    _exception_number,4    | where we put what trap went off
  123.     .globl    _exception_2_vector
  124. _exception_2_vector:
  125.     movel    #2,_exception_number    | bus error
  126.     bra    save_child
  127.     .globl    _exception_3_vector
  128. _exception_3_vector:
  129.     movel    #3,_exception_number    | address error
  130.     bra    save_child
  131.     .globl    _exception_4_vector
  132. _exception_4_vector:
  133.     movel    #4,_exception_number    | Illegal instr
  134.     bra    save_child
  135.     .globl    _exception_5_vector
  136. _exception_5_vector:
  137.     movel    #5,_exception_number    | Zero dir
  138.     bra    save_child
  139.     .globl    _exception_6_vector
  140. _exception_6_vector:
  141.     movel    #6,_exception_number    | CHK instr
  142.     bra    save_child
  143.     .globl    _exception_7_vector
  144. _exception_7_vector:
  145.     movel    #7,_exception_number    | TRAPV
  146.     bra    save_child
  147.     .globl    _exception_8_vector
  148. _exception_8_vector:
  149.     movel    #8,_exception_number    | priv
  150.     bra    save_child
  151.     .globl    _exception_9_vector
  152. _exception_9_vector:
  153.     movel    #9,_exception_number    | trace
  154.     bra    save_child
  155.  
  156.     .globl    _trap_f_vector
  157. _trap_f_vector:
  158.     movel    #10,_exception_number    | breakpoint (trap #f)
  159. #    bra    save_child
  160.  
  161. #
  162. # save the child context after some random trap
  163. #
  164.  
  165. save_child:
  166.     moveml    d0-a6,_child_context
  167.     lea    _child_context+15*4,a0
  168.     movel    usp,a1        | since this runs in super mode,
  169.     movel    a1,a0@+        |  we get the USP this way
  170.  
  171. #    movel    sp,a0@+        | that's the SSP
  172. #
  173. # if this was an address error or bus error, there's 2 extra words of
  174. # stuff on the (system) stack.
  175. #
  176.  
  177.     tstw    0x59e:w        |_longframe
  178.     beq    notlong2
  179.  
  180. | new code to handle 680x0 frames, where x > 0
  181.  
  182. .data
  183. ex_sizes:    .byte    0, 0, 4, 0,0,0,0,0, 50, 12, 24, 84, 0,0,0,0
  184. .text
  185.     movew    sp@+,d0
  186.     movel    sp@+,a0@+
  187.     movew    d0,a0@+
  188.  
  189.     moveq    #0,d0        | pre-clear d0
  190.     movew    sp@+,d0        | get frame word
  191.     lsrw    #8,d0        | shift into place
  192.     lsrw    #4,d0
  193.     lea    ex_sizes,a0
  194.     moveb    a0@(d0:w),d0    | d0 is now frame size
  195.     addw    d0,sp        | pop the whole frame off
  196.  
  197.     bra    long2done
  198.  
  199. | old code to handle 68000 frames incl bus err & addr err
  200.  
  201. notlong2:
  202.     movel    _exception_number,d0
  203.     cmpl    #2,d0
  204.     beq    save_child_1
  205.     cmpl    #3,d0
  206.     bne    save_child_2
  207. save_child_1:
  208.     addql    #8,sp        | skip the extra cruft.  later, maybe stash it
  209.                 | someplace?  GDB apparently doesn't use this
  210.                 | info
  211. save_child_2:
  212.     movew    sp@+,d0        | save the old SR
  213.     movel    sp@+,a0@+    | get the child PC
  214.     movew    d0,a0@+        | and finally save the SR
  215.     
  216. long2done:
  217.  
  218. #
  219. # restore the debugger's context, and rte into it
  220. #
  221.  
  222. run_debugger:
  223.     movel    _dbg_context+15*4,a0
  224.     movel    a0,usp
  225.     moveml    _dbg_context,d0-a6
  226.     tstw    0x59e:w        |_longframe
  227.     beq    notlong3
  228.     clrw    sp@-
  229. notlong3:
  230.     movel    _dbg_context+64,sp@-
  231.     movew    _dbg_context+68,sp@-
  232.     rte            | Poof!
  233.  
  234. #
  235. # now for some real magic.  After a trap, the way we get back into the
  236. # child context is by having our own trap vector for trap #0.  Our
  237. # vector does a context switch!
  238. #
  239.  
  240.     .globl    _trap_0_vector
  241. _trap_0_vector:
  242. #
  243. # save debugger context, so we can transfer back to
  244. # the child context
  245. #
  246.  
  247. save_debugger:
  248.     moveml    d0-a6,_dbg_context
  249.     lea    _dbg_context+15*4,a0
  250.     movel    usp,a1        | since this runs in super mode,
  251.     movel    a1,a0@+        |  we get the USP this way
  252.  
  253. #    movel    sp,a0@+        | that's the SSP
  254.  
  255.     movew    sp@+,d0        | save the old SR
  256.     movel    sp@+,a0@+    | get the child PC
  257.     movew    d0,a0@+        | and finally save the SR
  258.     tstw    0x59e:w        |_longframe
  259.     beq    notlong4
  260.     addqw    #2,sp        | pop frame word off
  261. notlong4:
  262.  
  263. #
  264. # Same deal, but run the child
  265. #
  266.  
  267. run_child:
  268.     movel    _child_context+15*4,a0
  269.     movel    a0,usp
  270.     moveml    _child_context,d0-a6
  271.     tstw    0x59e:w        |_longframe
  272.     beq    notlong5
  273.     clrw    sp@-
  274. notlong5:
  275.     movel    _child_context+64,sp@-
  276.     movew    _child_context+68,sp@-
  277.     rte            | Poof!
  278.